package com.xian.im.common.utils.bussiness;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Multimaps;
import com.xian.im.common.model.session.SessionUser;
import io.netty.channel.ChannelHandlerContext;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @program: xian-code
 * @description:
 * @author: liru.xian
 * @create: 2021-01-25 19:51
 */
public abstract class ChannelClientContextUtil {


  private static ListMultimap<String, String> CLIENT_CONTEXT = Multimaps.synchronizedListMultimap(ArrayListMultimap.create());

  /**
   * 建立连接后绑定用户关系
   *
   * @param userId
   * @param ctxId
   */
  public static void binding(String userId, String ctxId) {
    CLIENT_CONTEXT.put(userId, ctxId);
  }

  /**
   * 解除用户绑定
   *
   * @param userId
   * @param ctxId
   */
  public static void unbinding(String userId, String ctxId) {
    CLIENT_CONTEXT.remove(userId, ctxId);
  }

  /**
   * 指定连接渠道连接解除绑定
   *
   * @param userId
   * @param channel 连接渠道
   */
  public static void unbindingChannel(String userId, String channel) {
    Set<String> connections = getAllConnections(userId);
    for (String ctxId : connections) {
      //解除绑定关系
    }
  }

  public static void unbindingChannel(String userId) {
    Set<String> connections = getAllConnections(userId);
    for (String ctxId : connections) {
      // todo 关闭连接
      // 调用tcp-server
      // 解除绑定
      unbinding(userId, ctxId);
    }
  }

  /**
   * 获取channel 信息
   * @param ctxId
   * @return
   */
  public static ChannelHandlerContext getCtxById(String ctxId) {
/*    ChannelHandlerContext channelHandlerContext = CONTEXT_MAP.get(ctxId);
    if (channelHandlerContext != null) {
      return channelHandlerContext;
    }*/
    return null;
  }
  /**
   * 获取用户多端登录连接
   *
   * @param userId
   * @return
   */
  public static Set<String> getAllConnections(String userId) {
    Set<String> channelIds = CLIENT_CONTEXT.asMap().keySet();
    if (channelIds != null && !channelIds.isEmpty()) {
      return channelIds;
    }
    return null;
  }

  /**
   * 获取session
   * @return
   */
  public abstract SessionUser getSession(String userId);
}
